﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Datos.Entidades;
using Datos.Fabricas;
using Datos.Interfaces;
using System.Data.SqlClient;
using Datos.Entidades.FabricaEntidades;
using log4net;

namespace Datos.DAOSqlServer
{
    public class DAOSqlAccesoMaquina:IDAOAccesoMaquina
    {

          IDAOAccesoConexion bd = FabricaConexion.DAOSqlServerAccesoConexion();
          #region Logger
          private static readonly ILog log = LogManager.GetLogger(
          System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);





          #endregion 
       public DAOSqlAccesoMaquina()
       {

       }
        /// <summary>
        /// Inserta en la BD el establecimiento validando que no haya uno existente con la misma data.
        /// </summary>
        /// <param name="nombre">Nombre del establecimiento Ej: Samoa</param>
        /// <param name="tipo">Tipo del establecimiento Ej: Restaurant</param>
        /// <param name="capacidad">Capacidad del establecimiento Ej: 60 (personas)</param>
        /// <param name="piso">Piso donde se encuentra el establecimiento Ej: 2, PH, Acuarium</param>
        /// <param name="nlocal">Numero del Local Ej: A-45</param>
        /// <param name="telefono">Telefono con codigo de area Ej: 0212-1234567</param>
        /// <param name="mail">Correo del establecimiento Ej: correo@establecimiento.com</param>
        /// <param name="fklugar">ID del lugar donde se encuentra el establecimiento</param>
        /// <returns>El ID del Establecimiento que se acaba de insertar o el del establecimiento
        /// que cumpla con los mismos atributos de nombre y de fklugar</returns>
        public Boolean CrearMaquina(Entidad maquina)
        {
            


            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[INSMaquina]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                //Correspondencia de atributos de la clase con los parámetros del procedimiento almacenado en la base de datos.
                command.Parameters.AddWithValue("@nombreLocal", (maquina as Maquina).NombreLocal);
                command.Parameters.AddWithValue("@Estatus", (maquina as Maquina).Estatus1);
                command.Parameters.AddWithValue("@Ciudad", (maquina as Maquina).Ciudad);
                command.Parameters.AddWithValue("@Estado", (maquina as Maquina).Estado);
                command.Parameters.AddWithValue("@Mail", (maquina as Maquina).Piso);
                command.Parameters.AddWithValue("@Telefono", (maquina as Maquina).Telefono);
                command.Parameters.AddWithValue("@Direccion", (maquina as Maquina).Calle);
                command.Parameters.AddWithValue("@Longitud", (decimal)(maquina as Maquina).Longitud);
                command.Parameters.AddWithValue("@Latitud", (decimal)(maquina as Maquina).Latitud);
                command.Parameters.AddWithValue("@Altitud", (maquina as Maquina).Altitud);

                command.ExecuteNonQuery();
                log.Info("Se ejecuto la consulta");
               // SqlDataReader reader = command.ExecuteReader();
                //reader.Close();
                bd.CerrarConexionBd();

                return (true);
            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();

                log.Error("No se ejecuto la consulta");
                return false;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                log.Error("Error en la aplicacion");
                return false;
            }
        }


        public Entidad BuscarMaquina(int idMaquina)
        {
            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELMaquina]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@IdMaquina", idMaquina);

                SqlDataReader reader = command.ExecuteReader();
                Entidad maquina = FabricaEntidades.ObtenerMaquina();
               // while (reader.Read())
                //{
                    if(reader.Read()){
                    (maquina as Maquina).IdMaquina = (reader.GetInt32(0));
                    (maquina as Maquina).NombreLocal = (reader["NombreLocal"] as String);
                    (maquina as Maquina).Estatus1 = (reader.GetInt32(10));
                    (maquina as Maquina).Estado = (reader["Estado"] as String);
                    (maquina as Maquina).Ciudad = (reader["Ciudad"] as String);
                    (maquina as Maquina).Altitud = (reader["altitud"] as String);
                    (maquina as Maquina).Calle = (reader["direccionn"] as String);
                    (maquina as Maquina).Piso = (reader["mail"] as String);
                    (maquina as Maquina).Telefono = (reader["telefono"] as String);
                    (maquina as Maquina).Longitud = (decimal)reader["longitud"];
                    (maquina as Maquina).Latitud = (decimal)reader["latitud"];

                    } reader.Close();
                    bd.CerrarConexionBd();
                    log.Info("Se ejecuto la consulta");
                return (maquina);
            }

            catch (SqlException)
            {
                log.Error("No se ejecuto la consulta");
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                log.Error("Error en la aplicacion");
                bd.CerrarConexionBd();
                return null;
            }
        }

        public List<Entidad> ObtenerMaquinas(int estatus)
        {
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SELFMaquina]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@estatus",estatus);

                List <Entidad> listaMaquina=new List<Entidad>();
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Entidad maquina = FabricaEntidades.ObtenerMaquina();
                    (maquina as Maquina).IdMaquina = (reader.GetInt32(0));
                    (maquina as Maquina).NombreLocal = (reader["NombreLocal"] as String);
                    (maquina as Maquina).Estatus1 = (reader.GetInt32(10));
                    (maquina as Maquina).Estado= (reader["Estado"] as String);
                    (maquina as Maquina).Ciudad= (reader["Ciudad"] as String);
                    (maquina as Maquina).Altitud= (reader["altitud"] as String);
                    (maquina as Maquina).Calle= (reader["direccionn"] as String);
                    (maquina as Maquina).Piso= (reader["mail"] as String);
                    (maquina as Maquina).Telefono= (reader["telefono"] as String);
                    (maquina as Maquina).Longitud= (decimal)reader["longitud"];
                    (maquina as Maquina).Latitud= (decimal)reader["latitud"];
                    listaMaquina.Add((maquina as Maquina));
                }

                reader.Close();
                bd.CerrarConexionBd();
                log.Info("Se ejecuto la consulta");
                return listaMaquina;
            }
            catch (SqlException)
            {
                log.Error("Error en la consulta");
                bd.CerrarConexionBd();
                return null;
            }
            catch (Exception)
            {
                log.Error("Error en la aplicacion");
                bd.CerrarConexionBd();
                return null;
            }
        }


        public List<Entidad> ObtenerTodasMaquinas()
        {
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SELTodasMaquina]";
                command.CommandTimeout = 10;

                List<Entidad> listaMaquina = new List<Entidad>();
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Entidad maquina = FabricaEntidades.ObtenerMaquina();
                    (maquina as Maquina).IdMaquina = (reader.GetInt32(0));
                    (maquina as Maquina).NombreLocal = (reader["NombreLocal"] as String);
                    (maquina as Maquina).Estatus1 = (reader.GetInt32(10));
                    (maquina as Maquina).Estado = (reader["Estado"] as String);
                    (maquina as Maquina).Ciudad = (reader["Ciudad"] as String);
                    (maquina as Maquina).Altitud = (reader["altitud"] as String);
                    (maquina as Maquina).Calle = (reader["direccionn"] as String);
                    (maquina as Maquina).Piso = (reader["mail"] as String);
                    (maquina as Maquina).Telefono = (reader["telefono"] as String);
                    (maquina as Maquina).Longitud = (decimal)reader["longitud"];
                    (maquina as Maquina).Latitud = (decimal)reader["latitud"];
                    listaMaquina.Add((maquina as Maquina));
                }

                reader.Close();
                bd.CerrarConexionBd();
                log.Info("Se ejecuto la consulta");
                return listaMaquina;
            }
            catch (SqlException)
            {
                bd.CerrarConexionBd();
                log.Error("Error en la consulta");
                return null;
            }
            catch (Exception)
            {
                log.Error("Error en la aplicacion");
                bd.CerrarConexionBd();
                return null;
            }
        }


        public bool ModificarMaquina(Entidad maquina)
        {
           
            SqlCommand command = new SqlCommand();

            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[UPDMaquina]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@IdMaquina", (maquina as Maquina).IdMaquina);

                //Correspondencia de atributos de la clase con los parámetros del procedimiento almacenado en la base de datos.
                command.Parameters.AddWithValue("@NombreLocal", (maquina as Maquina).NombreLocal);
                command.Parameters.AddWithValue("@Estatus", (maquina as Maquina).Estatus1);
                command.Parameters.AddWithValue("@Ciudad", (maquina as Maquina).Ciudad);
                command.Parameters.AddWithValue("@Estado", (maquina as Maquina).Estado);
                command.Parameters.AddWithValue("@mail", (maquina as Maquina).Piso);
                command.Parameters.AddWithValue("@telefono", (maquina as Maquina).Telefono);
                command.Parameters.AddWithValue("@direccionn", (maquina as Maquina).Calle);
                command.Parameters.AddWithValue("@longitud",(decimal) (maquina as Maquina).Longitud);
                command.Parameters.AddWithValue("@latitud", (decimal)(maquina as Maquina).Latitud);
                command.Parameters.AddWithValue("@altitud", (maquina as Maquina).Altitud);

                command.ExecuteNonQuery();
                bd.CerrarConexionBd();
                log.Info("Se genero la consulta");
                return (true);
            }

            catch (SqlException)
            {
                log.Error("Error en la consulta");
                bd.CerrarConexionBd();
                return false;
            }

            catch (Exception)
               
            {
                log.Error("Error en la aplicacion");
                bd.CerrarConexionBd();
                return false;
            }
        }

    }
}
